home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / PIL / FpxImagePlugin.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  4KB  |  136 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __version__ = '0.1'
  5. import string
  6. import Image
  7. import ImageFile
  8. from OleFileIO import *
  9. MODES = {
  10.     32766: ('A', 'L'),
  11.     (65536,): ('L', 'L'),
  12.     (98304, 98302): ('RGBA', 'LA'),
  13.     (131072, 131073, 131074): ('RGB', 'YCC;P'),
  14.     (163840, 163841, 163842, 163838): ('RGBA', 'YCCA;P'),
  15.     (196608, 196609, 196610): ('RGB', 'RGB'),
  16.     (229376, 229377, 229378, 229374): ('RGBA', 'RGBA') }
  17.  
  18. def _accept(prefix):
  19.     return prefix[:8] == MAGIC
  20.  
  21.  
  22. class FpxImageFile(ImageFile.ImageFile):
  23.     format = 'FPX'
  24.     format_description = 'FlashPix'
  25.     
  26.     def _open(self):
  27.         
  28.         try:
  29.             self.ole = OleFileIO(self.fp)
  30.         except IOError:
  31.             raise SyntaxError, 'not an FPX file; invalid OLE file'
  32.  
  33.         if self.ole.root.clsid != '56616700-C154-11CE-8553-00AA00A1F95B':
  34.             raise SyntaxError, 'not an FPX file; bad root CLSID'
  35.         
  36.         self._open_index(1)
  37.  
  38.     
  39.     def _open_index(self, index = 1):
  40.         prop = self.ole.getproperties([
  41.             'Data Object Store %06d' % index,
  42.             '\x05Image Contents'])
  43.         self.size = (prop[16777218], prop[16777219])
  44.         size = max(self.size)
  45.         i = 1
  46.         while size > 64:
  47.             size = size / 2
  48.             i = i + 1
  49.         self.maxid = i - 1
  50.         id = self.maxid << 16
  51.         s = prop[33554434 | id]
  52.         colors = []
  53.         for i in range(i32(s, 4)):
  54.             colors.append(i32(s, 8 + i * 4) & 2147483647)
  55.         
  56.         (self.mode, self.rawmode) = MODES[tuple(colors)]
  57.         self.jpeg = { }
  58.         for i in range(256):
  59.             id = 50331649 | i << 16
  60.             if prop.has_key(id):
  61.                 self.jpeg[i] = prop[id]
  62.                 continue
  63.         
  64.         self._open_subimage(1, self.maxid)
  65.  
  66.     
  67.     def _open_subimage(self, index = 1, subimage = 0):
  68.         stream = [
  69.             'Data Object Store %06d' % index,
  70.             'Resolution %04d' % subimage,
  71.             'Subimage 0000 Header']
  72.         fp = self.ole.openstream(stream)
  73.         p = fp.read(28)
  74.         s = fp.read(36)
  75.         size = (i32(s, 4), i32(s, 8))
  76.         tilecount = i32(s, 12)
  77.         tilesize = (i32(s, 16), i32(s, 20))
  78.         channels = i32(s, 24)
  79.         offset = i32(s, 28)
  80.         length = i32(s, 32)
  81.         if size != self.size:
  82.             raise IOError, 'subimage mismatch'
  83.         
  84.         fp.seek(28 + offset)
  85.         s = fp.read(i32(s, 12) * length)
  86.         x = y = 0
  87.         (xsize, ysize) = size
  88.         (xtile, ytile) = tilesize
  89.         self.tile = []
  90.         for i in range(0, len(s), length):
  91.             compression = i32(s, i + 8)
  92.             if compression == 0:
  93.                 self.tile.append(('raw', (x, y, x + xtile, y + ytile), i32(s, i) + 28, self.rawmode))
  94.             elif compression == 1:
  95.                 self.tile.append(('fill', (x, y, x + xtile, y + ytile), i32(s, i) + 28, (self.rawmode, s[12:16])))
  96.             elif compression == 2:
  97.                 internal_color_conversion = ord(s[14])
  98.                 jpeg_tables = ord(s[15])
  99.                 rawmode = self.rawmode
  100.                 if internal_color_conversion:
  101.                     if rawmode == 'RGBA':
  102.                         (jpegmode, rawmode) = ('YCbCrK', 'CMYK')
  103.                     else:
  104.                         jpegmode = None
  105.                 else:
  106.                     jpegmode = rawmode
  107.                 self.tile.append(('jpeg', (x, y, x + xtile, y + ytile), i32(s, i) + 28, (rawmode, jpegmode)))
  108.                 if jpeg_tables:
  109.                     self.tile_prefix = self.jpeg[jpeg_tables]
  110.                 
  111.             else:
  112.                 raise IOError, 'unknown/invalid compression'
  113.             x = x + xtile
  114.             if x >= xsize:
  115.                 x = 0
  116.                 y = y + ytile
  117.                 if y >= ysize:
  118.                     break
  119.                 
  120.             y >= ysize
  121.         
  122.         self.stream = stream
  123.         self.fp = None
  124.  
  125.     
  126.     def load(self):
  127.         if not self.fp:
  128.             self.fp = self.ole.openstream(self.stream[:2] + [
  129.                 'Subimage 0000 Data'])
  130.         
  131.         ImageFile.ImageFile.load(self)
  132.  
  133.  
  134. Image.register_open('FPX', FpxImageFile, _accept)
  135. Image.register_extension('FPX', '.fpx')
  136.